home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hottest 6
/
Hottest 6 (1996)(PDSoft)[!].iso
/
software
/
videoutils
/
n-z
/
tmap
/
polyfill.asm
< prev
next >
Wrap
Assembly Source File
|
1978-11-24
|
5KB
|
289 lines
;$$TABS=8
;
; PolyFill.asm - simple, stupid polygon filler. No heavy attempt at
; optimization, since this demo doesn't really use it much.
include 'demo.i'
VERTEX_SIZE equ 4*2 ; xyuv
xref YLRFill,YLRCCFill,YLRUUFill
fracbits equ 6
get_right:
; now, loop until y change
move.l d5,save_d5(a6)
move.l right_ptr(a6),a2
gr_1: move (a2),d4
move.w 4(a2),d5 ; rightc
lea VERTEX_SIZE(a2),a2
cmp.l a0,a2
bne.s gr_2
lea vertex(a6),a2
gr_2 move (a2),d1
move 2(a2),d7
subq #1,d0 ; better check for neg
ble.s got_right
cmp d7,d2 ; same y ?
ble.s gr_1
; now, d4,d2=top d1/d7=bot
move.w d5,c_right(a6)
sub 4(a2),d5
ext.l d5
move d7,rbot(a6)
sub d2,d7
divs d7,d5
move.w d5,dc_right(a6)
neg d7
sub d4,d1 ; dx
ext.l d1
lsl.l #fracbits,d1
divs d7,d1 ; dx/dy<<fracbits
ext.l d1
moveq #16-fracbits,d7
lsl.l d7,d1
swap d4
clr d4
move.l save_d5(a6),d5
got_right:
move.l a2,right_ptr(a6)
rts
get_left:
move.l left_ptr(a6),a1
move.l d5,save_d5(a6)
move.l d4,save_d4(a6)
; now, loop until y change
gl_1: move (a1),d3
move 4(a1),d4
lea -VERTEX_SIZE(a1),a1
cmp.l #vertex-VERTEX_SIZE,a1
bne.s gl_2
lea -VERTEX_SIZE(a0),a1
gl_2 move (a1),d5
move 2(a1),d7
; same y
subq #1,d0 ; better check for neg
ble.s got_left_lst
cmp d7,d2 ; same y ?
ble.s gl_1
; now, d3,d2=top d1/d7=bot
move.w d4,c_left(a6)
move d7,lbot(a6)
sub d2,d7
sub 4(a1),d4
ext.l d4
divs d7,d4
move.w d4,dc_left(a6)
neg d7
sub d3,d5 ; dx
ext.l d5
lsl.l #fracbits,d5
divs d7,d5 ; dx/dy<<fracbits
ext.l d5
moveq #16-fracbits,d7
lsl.l d7,d5
swap d3
clr d3
move.l a1,left_ptr(a6)
move.l save_d4(a6),d4
got_left
rts
got_left_lst
move.l a1,left_ptr(a6)
move.l save_d5(a6),d5
rts
UnClippedPolygon::
; UnClippedPolygon - draw an unclipped polygon
; entr: VERTEX=x,y x,y x,y ...
; D0=nverts (3 for a triangle)
; except for termination, this routine fits entirely in the 256 byte cache.
ONTIMER 5
move d0,d1 ; loop ctr
subq #1,d1
moveq #-127,d2 ; highest so far
lea vertex(a6),a0
move.l a0,a3 ; leftmost vertex
move.l a0,a4 ; rightmost vertex
up_1: move.w (a0),d3
cmp.w (a3),d3
bge.s no_new_left
move.l a0,a3
no_new_left:
cmp.w (a4),d3
ble.s no_new_right
move.l a0,a4
no_new_right:
cmp 2(a0),d2
bgt.s up_2
move 2(a0),d2
move.l a0,a1 ; pointer to top
up_2: lea VERTEX_SIZE(a0),a0
dbra d1,up_1
move.l a1,a2
movem.l a1/a2/a3/a4,left_ptr(a6)
; now, fill in vtable!
move.l YLRFiller(a6),d1
cmp.l #YLRUUFill,d1
bne.s done_vtable
move.w (a3),d1 ; leftx
move.w 6(a3),d5 ; leftv
move.w (a4),d3 ; rightx
move.w 6(a4),d4 ; rightv
move.l current_tmap(a6),a4
move.w 4(a4),d6 ; shift up
lea 6(a4),a4
lea (vtable.w,a6,d1.w*4),a2 ; outv
sub d5,d4 ; rv-lv
addq #1,d4
sub d1,d3 ; rx-lx
addq #1,d3
ext.l d4
divs d3,d4
subq #1,d3
1$: moveq #0,d7
move.w d5,d7
lsr.w #8,d7
lsl.l d6,d7
add.l a4,d7
move.l d7,(a2)+
add.w d4,d5
dbra d3,1$
done_vtable:
addq #1,d0
bsr get_left
bsr get_right
; register usage:
; d0=#verts left
; d1=rightdx<<16
; d2=cury
; d3=leftx<<16
; d4=rightx<<16
; d5=leftdx<<16
; d6=ycounter
; (a0)=end of vertex buffer+4
; (a3)=ylr ptr
;
lea temp_ylr(pc),a3
new_trapezoid:
tst d0
ble.s do_end
move d2,d6 ; top y
move d2,d7
sub lbot(a6),d6
sub rbot(a6),d7
cmp d6,d7
bge.s no_r_ends_first
move d7,d6
no_r_ends_first:
move.w d0,-(a7)
move.w c_left(a6),d7
move.w c_right(a6),d0
move.w dc_left(a6),a1
move.w dc_right(a6),a2
ONTIMER 11
subq #1,d6
fill_lp:
move d2,(a3)+
swap d3
subq #1,d2
move d3,(a3)+
swap d3
swap d4
move d4,(a3)+
swap d4
add.l d1,d4
move.w d7,(a3)+
add.w a1,d7
move.w d0,(a3)+
add.w a2,d0
add.l d5,d3
dbra d6,fill_lp
OFFTIMER 11
move.w d0,c_right(a6)
move.w d7,c_left(a6)
move.w (a7)+,d0
cmp lbot(a6),d2
bne.s no_l_chg
bsr get_left
no_l_chg:
cmp rbot(a6),d2
bne new_trapezoid
bsr get_right
bra new_trapezoid
do_end:
; do last scan line
lea temp_ylr(pc),a4
cmp.l a3,a4
bne.s tr_1
; no scan-lines were output, so fill a horizontal line between max and min x/y
yes_fill1:
move.l leftmost_vertex(a6),a0
move.l rightmost_vertex(a6),a1
move d2,(a3)+
move (a0),(a3)+
move (a1),(a3)+
move 4(a0),(a3)+
move 4(a1),(a3)+
st (a3)
lea temp_ylr(pc),a0
OFFTIMER 5
move.l YLRFiller(a6),a1
jmp (a1)
tr_1: move d2,(a3)+
swap d3
swap d4
move d3,(a3)+
move d4,(a3)+
move.l c_left(a6),(a3)+
no_fill2:
st (a3)
lea temp_ylr(pc),a0
OFFTIMER 5
move.l YLRFiller(a6),a1
jmp (a1)
temp_ylr::
ds.w (DUNGEON_WINDOW_HEIGHT+3)*5+1
section __MERGED,data
YLRFiller:: dc.l YLRCCFill
save_d5:: ds.l 1
save_d4:: ds.l 1
rbot:: ds.w 1
lbot:: ds.w 1
; tmapped polygon data fmt:
; xyuv
vertex::
ds.b 50*VERTEX_SIZE ; enough room for 50 point poly
left_ptr:: dc.l 0
right_ptr:: dc.l 0
leftmost_vertex::
dc.l 0
rightmost_vertex::
dc.l 0
c_left:: dc.w $2000
c_right:: dc.w $4000
dc_left:: dc.w $0000
dc_right:: dc.w $0000
current_tmap:: dc.l 0
dc.l 0
vtable:: ds.l DUNGEON_WINDOW_WIDTH
dc.l 0
end